/**
* @author Lourdes Sanchez
* @author Eugenia Jose
* @author Esteban Castro
* @author Carlos Fernandez
* @author Fernando Turon
* @version 1.0 01-05-12
*
* La clase GestorUsuario se encarga de gestionar la persistencia de los datos relativos a Usuarios
*
* @see Usuario, GestorBBDD
*/
package edu.uoc.tds.pec4.server.bbdd;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.model.Usuario;
import edu.uoc.tds.pec4.model.Administrador;
import edu.uoc.tds.pec4.model.Estudiante;
import edu.uoc.tds.pec4.model.ResponsablePrueba;
import edu.uoc.tds.pec4.model.TipoUsuario;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.exception.UsuarioNoValidadoException;
import edu.uoc.tds.pec4.exception.TipoUsuarioNoExisteException;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.swing.JOptionPane;


public class GestorUsuario {
    RemotoInterface remoto;

    public GestorUsuario(RemotoInterface remoto){
        this.remoto = remoto;
    }

    /**
     * Método para obtener una instancia de Usuario a partir de su login y clave de conexión
     * {pre: un login y clave de conexión}
     * {post: una instancia de Usuario que referencia, según el tipo de usuario a un Administrador,Responsable de Prueba o Estudiante}
     * @param login_usuario hace referencia al login del usuario.
     * @param clave hace referencia a la clave del usuario. 
     */
    public Usuario validarUsuario(String login_usuario, String clave){
        Usuario usuario = new Usuario();
	String sqlString = "SELECT id_usuario,id_tipo_usuario,id_universidad,usuario,clave,nombre,apellido_primero,apellido_segundo,documento,fecha_alta,fecha_baja FROM usuario where usuario = ? and clave = ?";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setString(1,login_usuario);
            preparedStatement.setString(2,clave);
            resultSet = preparedStatement.executeQuery();
            if(resultSet.next()){
                if (resultSet.getInt("id_tipo_usuario") == TipoUsuario.EnumTipoUsuario.ADMINISTRADOR.getIdTipoUsuario()){
                    usuario = new Administrador(resultSet.getInt("id_usuario"),
                            resultSet.getString("usuario"),resultSet.getString("clave"),
                            resultSet.getString("nombre"),resultSet.getString("apellido_primero"),
                            resultSet.getString("apellido_segundo"),resultSet.getString("documento"),
                            resultSet.getDate("fecha_alta"),resultSet.getDate("fecha_baja"));
                }else if (resultSet.getInt("id_tipo_usuario") == TipoUsuario.EnumTipoUsuario.RESPONSABLEPRUEBA.getIdTipoUsuario()){
                    usuario = new ResponsablePrueba(resultSet.getInt("id_usuario"),
                            resultSet.getString("usuario"),resultSet.getString("clave"),
                            resultSet.getString("nombre"),resultSet.getString("apellido_primero"),
                            resultSet.getString("apellido_segundo"),resultSet.getString("documento"),
                            resultSet.getDate("fecha_alta"),resultSet.getDate("fecha_baja"));
                }else if (resultSet.getInt("id_tipo_usuario") == TipoUsuario.EnumTipoUsuario.ESTUDIANTE.getIdTipoUsuario()){
                    usuario = new Estudiante(resultSet.getInt("id_usuario"),
                            resultSet.getString("usuario"),resultSet.getString("clave"),
                            resultSet.getString("nombre"),resultSet.getString("apellido_primero"),
                            resultSet.getString("apellido_segundo"),resultSet.getString("documento"),
                            resultSet.getDate("fecha_alta"),resultSet.getDate("fecha_baja"),
                            resultSet.getInt("id_universidad"));
                }
                else{
                    throw new TipoUsuarioNoExisteException(GestorIdiomas.getMessage("error.tipousuario.no.existente"));
                }
            }else{
                throw new UsuarioNoValidadoException(GestorIdiomas.getMessage("error.usuario.no.validado"));
            }
        }
         /** Capturamos el error de tipo de usuario no existe */
        catch(TipoUsuarioNoExisteException exc){
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
         /** Capturamos el error de Usuario no validado porque no se encuentra en el sistema */
        catch(UsuarioNoValidadoException exc){
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** Capturamos excepción de carácter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** En todo caso ejecutamos el siguiente código*/
        finally {
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepción de carácter general*/
            catch (Exception exc) {
                //Excepción inesperada
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }

        return usuario;
    }
    
    /**
     * Método para obtener una instancia de Usuario a partir de identificador
     * {pre: identificador de un usuario}
     * {post: una instancia de Usuario que referencia, según el tipo de usuario a un Administrador,Responsable de Prueba o Estudiante}
     * @param id_usuario hace referencia al identificador del usuario.
     */
    public Usuario getUsuario(int id_usuario){
        Usuario usuario = new Usuario();
	String sqlString = "SELECT id_usuario,id_tipo_usuario,id_universidad,usuario,clave,nombre,apellido_primero,apellido_segundo,documento,fecha_alta,fecha_baja FROM usuario where id_usuario = ?";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1,id_usuario);
            resultSet = preparedStatement.executeQuery();
            if(resultSet.next()){
                if (resultSet.getInt("id_tipo_usuario") == TipoUsuario.EnumTipoUsuario.ADMINISTRADOR.getIdTipoUsuario()){
                    usuario = new Administrador(resultSet.getInt("id_usuario"),
                            resultSet.getString("usuario"),resultSet.getString("clave"),
                            resultSet.getString("nombre"),resultSet.getString("apellido_primero"),
                            resultSet.getString("apellido_segundo"),resultSet.getString("documento"),
                            resultSet.getDate("fecha_alta"),resultSet.getDate("fecha_baja"));
                }else if (resultSet.getInt("id_tipo_usuario") == TipoUsuario.EnumTipoUsuario.RESPONSABLEPRUEBA.getIdTipoUsuario()){
                    usuario = new ResponsablePrueba(resultSet.getInt("id_usuario"),
                            resultSet.getString("usuario"),resultSet.getString("clave"),
                            resultSet.getString("nombre"),resultSet.getString("apellido_primero"),
                            resultSet.getString("apellido_segundo"),resultSet.getString("documento"),
                            resultSet.getDate("fecha_alta"),resultSet.getDate("fecha_baja"));
                }else if (resultSet.getInt("id_tipo_usuario") == TipoUsuario.EnumTipoUsuario.ESTUDIANTE.getIdTipoUsuario()){
                    usuario = new Estudiante(resultSet.getInt("id_usuario"),
                            resultSet.getString("usuario"),resultSet.getString("clave"),
                            resultSet.getString("nombre"),resultSet.getString("apellido_primero"),
                            resultSet.getString("apellido_segundo"),resultSet.getString("documento"),
                            resultSet.getDate("fecha_alta"),resultSet.getDate("fecha_baja"),
                            resultSet.getInt("id_universidad"));
                }
                else{
                    throw new TipoUsuarioNoExisteException(GestorIdiomas.getMessage("error.tipousuario.no.existente"));
                }
            }else{
                throw new UsuarioNoValidadoException(GestorIdiomas.getMessage("error.usuario.no.validado"));
            }
        }
         /** Capturamos el error de tipo de usuario no existe */
        catch(TipoUsuarioNoExisteException exc){
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
         /** Capturamos el error de Usuario no validado porque no se encuentra en el sistema */
        catch(UsuarioNoValidadoException exc){
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** Capturamos excepción de carácter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** En todo caso ejecutamos el siguiente código*/
        finally {
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepción de carácter general*/
            catch (Exception exc) {
                //Excepción inesperada
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }

        return usuario;
    }
}
